package pe.edu.upc.e41a.javasoft.service;

import java.util.List;

import javax.annotation.Resource;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.edu.upc.e41a.javasoft.dao.UsuarioDao;
import pe.edu.upc.e41a.javasoft.domain.TipoDocumento;
import pe.edu.upc.e41a.javasoft.domain.Usuario;

@Service
@Transactional
public class UsuarioServiceImpl implements UsuarioService {

	@Resource
	private UsuarioDao usuarioDao;

	@Override
	public String insertarUsuario(Usuario usuario) {
		String mensaje = null;
		try {
			mensaje = ValidaUsuario(usuario);
			if (mensaje != "ok")
				return mensaje;
			mensaje = validaNumeroDocumento(usuario);
			if (mensaje != "ok")
				return mensaje;
			mensaje = validaCorreo(usuario);
			if (mensaje != "ok")
				return mensaje;
			mensaje = validaUser(usuario);
			if (mensaje != "ok")
				return mensaje;

			if (mensaje != "ok")
				return mensaje;
			usuarioDao.saveUsuario(usuario);
			mensaje = "El usuario se registró exitosamente";
		} catch (Exception e) {
			//mensaje = "Error al registrar usuario";
			//return mensaje;
		}

		return mensaje;
	}

	private String ValidaUsuario(Usuario usuario) {
		String mensaje = "ok";
		if (usuario.getTipoPersona()==null){
			mensaje = "El tipo de persona no puede ser Nulo";

		}else if(usuario.getTipoDocumento()==null){
			mensaje = "El tipo de documento no puede ser Nulo";

		}else if(usuario.getUsuario() == null) {
			mensaje = "El nombre de usuario no puede ser Nulo";

		}else if (usuario.getApellidoPaterno()==null) {
			mensaje = "El apellido paterno de usuario no puede ser Nulo";

		}else if (usuario.getApellidoMaterno()==null) {
			mensaje = "El apellido materno de usuario no puede ser Nulo";

		}else if (usuario.getSexo()==null) {
			mensaje = "El género sexual de usuario no puede ser Nulo";

		}else if (usuario.getNumeroDocumento()==null) {
			mensaje = "El número de documento de usuario no puede ser Nulo";

		}else if (usuario.getCorreo()==null) {
			mensaje = "El nombre de correo electronico de usuario no puede ser Nulo";

		}else if (usuario.getTelefono()==null) {
			mensaje = "El número de telefono de usuario no puede ser Nulo";
			
		}else if (usuario.getFechaNacimiento()==null) {
			mensaje = "La fecha de nacimiento de usuario no puede ser Nulo";

		}else if (usuario.getUsuario()==null) {
			mensaje = "El nombre de usuario no puede ser Nulo";
	
		}else if (usuario.getClave()==null) {
			mensaje = "La clave de usuario no puede ser Nulo";

		}
		

		return mensaje;
	}
	
	private String validaNumeroDocumento(Usuario usuario){
		String mensaje = "ok";
		if (usuario.getNumeroDocumento()!= null) {
			mensaje=buscarUsuariosPorNumeroDocumentoIgual(usuario.getNumeroDocumento());
		}
		return mensaje;
	}
	
	private String validaCorreo(Usuario usuario){
		String mensaje = "ok";
		if (usuario.getCorreo()!=null) {
			mensaje=buscarUsuariosPorCorreoIgual(usuario.getCorreo());
		}
		return mensaje;
	}
	
	private String validaUser(Usuario usuario){
		String mensaje = "ok";
		if (usuario.getCorreo()!=null) {
			mensaje=buscarUsuariosPorUsuarioIgual(usuario.getUsuario());
		}
		return mensaje;
	}
	
	@Override
	public List<Usuario> listarUsuario() {
		List<Usuario> listUsuarios;
		listUsuarios = usuarioDao.findAllUsuarios();
		return listUsuarios;
	}

	@Override
	public String actualizarUsuario(Usuario usuario) {
		String mensaje = null;
		try {
			usuarioDao.updateUsuario(usuario);
			mensaje = "El usuario se actualizo exitosamente";
		} catch (Exception e) {
			mensaje = "Error al actualizar usuario";
			return mensaje;
		}

		return mensaje;
	}

	@Override
	public String buscarUsuariosPorTipoDocumentoIgual(
			TipoDocumento tipoDocumento) {
		String mensaje = null;
		try {
		TypedQuery<Usuario> usuarioResultado= usuarioDao.findUsuariosByTipoDocumento(tipoDocumento);
		if (usuarioResultado.getResultList().size()==0){
			mensaje = "ok";
			}else {
				mensaje = "Ya existe un usuario con este tipo de documento";	
			}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}

	@Override
	public String buscarUsuariosPorNumeroDocumentoIgual(String numeroDocumento) {
		
		String mensaje = null;
		try {
			TypedQuery<Usuario> usuarioResultado=usuarioDao.findUsuariosByNumeroDocumentoEquals(numeroDocumento);
			if (usuarioResultado.getResultList().size()==0){
				mensaje = "ok";
				}else {
					System.out.println("entro en el mensaje else");
					mensaje = "Ya existe un usuario con este número de documento";	
				}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}

	@Override
	public String buscarUsuariosPorUsuarioIgual(String usuario) {

		String mensaje = null;
		try {
			TypedQuery<Usuario> usuarioResultado=usuarioDao.findUsuariosByUsuarioEquals(usuario);
			if (usuarioResultado.getResultList().size()==0){
				mensaje = "ok";
				}else {
					mensaje = "Ya existe un usuario con este código";	
				}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}

	@Override
	public String buscarUsuariosPorCorreoIgual(String correo) {

		String mensaje = null;
		try {
			TypedQuery<Usuario> usuarioResultado=usuarioDao.findUsuariosByCorreoEquals(correo);
			if (usuarioResultado.getResultList().size()==0){
			mensaje = "ok";
			}else {
				mensaje = "Ya existe un usuario con este email";	
			}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}


	


}
